import type { RouteRecordRaw } from 'vue-router'
import { generateSidebar } from './SideBarUtil'

export interface FlatPageItem {
  path: string
  name: string
  title: string
  level: number // 1: 一级目录, 2: 二级目录, 3: 具体页面
}

/**
 * 获取当前一级目录下的页面扁平化列表，按照侧边栏从上到下的顺序排列
 * @param currentPath 当前路径
 * @param mdRoutes 路由配置
 * @returns 扁平化的页面列表
 */
export function getFlatPageList(currentPath: string, mdRoutes: RouteRecordRaw[]): FlatPageItem[] {
  const flatList: FlatPageItem[] = []

  // 解析当前路径，确定当前所在的一级目录
  const pathSegs = currentPath.split('/').filter(Boolean)

  // 如果当前路径不是以docs开头或者长度不足，返回空数组
  if (pathSegs[0] !== 'docs' || pathSegs.length < 2) {
    return flatList
  }

  const currentDir = pathSegs[1] // 当前所在的一级目录，如 '技术领域'

  // 添加一级目录的index页面到列表开头
  const firstLevelIndexPath = `/docs/${currentDir}/`
  flatList.push({
    path: firstLevelIndexPath,
    name: `${currentDir}-index`,
    title: formatTitle(currentDir),
    level: 1,
  })

  // 获取该一级目录下的侧边栏项目
  const sidebarItems = generateSidebar(mdRoutes, `/docs/${currentDir}/`)

  // 遍历侧边栏项目（二级目录）
  sidebarItems.forEach((item) => {
    // 添加二级目录
    flatList.push({
      path: item.path,
      name: item.name,
      title: item.title,
      level: 2,
    })

    // 如果有子项，遍历子项（具体页面）
    if (item.children && item.children.length > 0) {
      // 直接使用侧边栏中的子项顺序，不进行额外排序
      item.children.forEach((child) => {
        flatList.push({
          path: child.path,
          name: child.name,
          title: child.title,
          level: 3,
        })
      })
    }
  })

  return flatList
}

/**
 * 获取当前页面的上一页和下一页
 * @param currentPath 当前路径
 * @param mdRoutes 路由配置
 * @returns 包含上一页和下一页信息的对象
 */
export function getPrevNextPages(currentPath: string, mdRoutes: RouteRecordRaw[]) {
  const flatList = getFlatPageList(currentPath, mdRoutes)

  // 查找当前页面在列表中的索引
  const currentIndex = flatList.findIndex((item) => item.path === currentPath)

  // 如果找不到当前页面，返回空
  if (currentIndex === -1) {
    return {
      prev: null,
      next: null,
    }
  }

  // 获取上一页和下一页
  const prev = currentIndex > 0 ? flatList[currentIndex - 1] : null
  const next = currentIndex < flatList.length - 1 ? flatList[currentIndex + 1] : null

  return {
    prev,
    next,
  }
}

/**
 * 格式化标题，将连字符转换为空格并首字母大写
 * @param str 原始字符串
 * @returns 格式化后的标题
 */
function formatTitle(str: string): string {
  // 处理中文目录名
  return str
    .split('-')
    .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
    .join(' ')
}
